/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package utils.conexao;

import java.lang.reflect.Field;
import java.util.ArrayList;

/**
 *
 * @author Oliver Kraemer
 */
public class DataBase {

    public class DataBaseIDException extends Exception {
        private DataBaseIDException() {
            super("Não foi possível Encontrar o campo ID.");
        }
    };

    public class DataBaseDuplicateIDDeclarationException extends Exception {
        private DataBaseDuplicateIDDeclarationException() {
            super("Não é permitida a duplicação do ID.");
        }
    };
    
    public class DataBaseIDIncorrectTypeException extends Exception {
        private DataBaseIDIncorrectTypeException() {
            super("Tipo do ID incorreto. O mesmo deve ser do tipo Integer");
        }
    }
    
    private IDataBase driver;

    public DataBase(IDataBase driver) {
        this.driver = driver;
    }

    public boolean persistir(Entity e) throws IllegalArgumentException, IllegalAccessException, DataBaseIDException, DataBaseDuplicateIDDeclarationException {
        Field field = null;
        for (Field f : e.getClass().getDeclaredFields()) {
            if (f.isAnnotationPresent(Id.class)) {
                if (field != null) {
                    throw new DataBaseDuplicateIDDeclarationException();
                }

                field = f;
            }
        }
        
        // Caso nenhum campo ID tenha sido anotado, jogamos exceção
        if ( field == null ) {
            throw new DataBaseIDException();
        }

        try {
            field.setAccessible(true);
            Integer valor = field.getInt(e);

            if ( valor == 0 ) {
                driver.generateNextCode(field, e);
                driver.inserir(e);
            } else {
                driver.alterar(e);
            }
            
            field.setAccessible(false);
            
            return true;
        } catch (IllegalArgumentException | IllegalAccessException ex) {
            throw ex;
        }
    }

    public boolean excluir(Entity e) throws DataBaseDuplicateIDDeclarationException, DataBaseIDException, IllegalArgumentException, IllegalAccessException {
        Field field = null;
        for (Field f : e.getClass().getDeclaredFields()) {
            if (f.isAnnotationPresent(Id.class)) {
                if (field != null) {
                    throw new DataBaseDuplicateIDDeclarationException();
                }

                field = f;
            }
        }
        
        if ( field == null ) {
            throw new DataBaseIDException();
        }

        field.setAccessible(true);
        
        if ( field.getInt(e) <= 0 ) {
            throw new DataBaseIDException();
        }
        
        field.setAccessible(false);

        driver.excluir(e);

        return true;
    }
    
    public ArrayList getAll(Class e) {
        return driver.getAll(e);
    }
}